package com.zhoux.reflect;

import java.lang.reflect.Constructor;

/**
 * @author taoyi
 * @version 1.0
 * @date 2021/3/15 9:05
 */
public class Example_Test {
    public static void main(String[] args) {
        Example_01 example01 = new Example_01("10","20","30");
        Class<? extends Example_01> exampleX = example01.getClass();
        // 获取所有构造方法
        Constructor[] declaredConstructors = exampleX.getDeclaredConstructors();
        for (int i = 0; i < declaredConstructors.length; i++) { // 遍历构造方法
            Constructor<?> constructors = declaredConstructors[i];
            System.out.println("查看是否允许带有可变数量的参数："+constructors.isVarArgs());
            System.out.println("该构造方法的入口参数类型依次为：");
            Class[] parameterTypes = constructors.getParameterTypes(); // 获取所有参数类型
            for (int j = 0; j < parameterTypes.length; j++) {
                System.out.println(" " + parameterTypes[j]);
            }
            System.out.println("该构造方法可能抛出的异常类型：");
            // 获取所有可能抛出的异常信息类型
            Class[] exceptionTypes = constructors.getExceptionTypes();
            for (int j = 0; j < exceptionTypes.length; j++) {
                System.out.println(" "+ exceptionTypes[j]);
            }
            Example_01 example02 = null;
            while (example02==null){
                try { //如果该成员变量的访问权限为private，则抛出异常，即不允许访问
                    if (i==2) // 通过执行默认没有参数的构造方法创建对象
                        example02 = (Example_01) constructors.newInstance();
                    else if (i==1) // 通过执行具有两个参数的构造方法创建对象
                        example02 = (Example_01) constructors.newInstance("7","5");
                    else {   // 通过执行具有可变数量参数的构造方法创建对象
                        Object[] parameters = new Object[]{new String[]{"100","200","300"}};
                        example02 = (Example_01)constructors.newInstance(parameters);
                    }
                } catch (Exception e) {
//                    e.printStackTrace();
                    System.out.println("在创建对象时抛出异常，下面执行setAccessible()方法");
                    constructors.setAccessible(true);  // 设置为允许访问
                }
            }
            if (example02 != null){
                example02.print();
                System.out.println();
            }
        }
    }
}

